リターンコード 255 を返すだけのRISC-Vアセンブリ
RISC-Vアセンブリプログラムの練習中。
今回はリターンコード 255 を返すだけのプログラムを作成してみる。
実行環境
クロスコンパイラ
M1Mac上に構築したの32ビットRISC-V(RV32G)クロスコンパイラ
プログラムの実行
RISC-V シミュレータ Spike でプログラムを実行
環境構築方法はこちらを参照
RISC-Vアセンブリのことは何ひとつ覚えてないので、Cのソースから生成したアセンブリを参考にする。
Cのコードを作成
code:return255.c
int main() {
return 255;
}
255が返る
code:sh
$ riscv32-unknown-elf-gcc return255.c
$ spike /opt/riscv/pk/riscv32-unknown-elf/bin/pk a.out
echo $?
255
Cのコードからアセンブリを出力
code:sh
$ riscv32-unknown-elf-gcc -S return255.c -o tmp.s
code:tmp.s
.file "return255.c"
.option nopic
.attribute arch, "rv32i2p0_m2p0_a2p0_f2p0_d2p0"
.attribute unaligned_access, 0
.attribute stack_align, 16
.text
.align 2
.globl main
.type main, @function
main:
addi sp,sp,-16
sw s0,12(sp)
addi s0,sp,16
li a5,255
mv a0,a5
lw s0,12(sp)
addi sp,sp,16
jr ra
.size main, .-main
.ident "GCC: () 12.2.0"
出力したアセンブリを参考に、最小限の処理を記述する
code:return255.S
.text
.align 2
.globl main
main:
// 返り値の 255 を返り値用のレジスタ a0 に格納
li a0, 255
// ra レジスタ(ra = Return address)に格納された呼び出し元のアドレスへジャンプ
jr ra
実行してみる。いい感じに動いてそう。
code:sh
$ riscv32-unknown-elf-gcc return255.S -o return255
$ spike /opt/riscv/pk/riscv32-unknown-elf/bin/pk return255
$ echo $?
255
返り値の返し方
a0 レジスタにセットした値が返り値として使われる。またa0 は関数呼び出し時の第一引数としても使われる
関数の呼び出し元への帰り方
ra アドレスに戻り先のアドレスが格納されているので、jr ra で戻る。
関数を呼び出すときは jal label すればいいのかな?